package com.demo.java.OD251_300.OD285;

import java.util.*;

/**
 * @author bug菌
 * @Source 公众号：猿圈奇妙屋
 * @des： 【Linux 发行版的数量】问题
 * @url： https://blog.csdn.net/weixin_43970743/article/details/146080075
 */
public class OdMain {
    static int n;  // 节点数量
    static int[][] nums;  // 邻接矩阵
    static List<Integer> res = new ArrayList<>();  // 存储每个连通子集的大小

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        n = scanner.nextInt();  // 输入节点数量
        nums = new int[n][n];  // 初始化邻接矩阵
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                nums[i][j] = scanner.nextInt();  // 输入邻接矩阵的值
            }
        }

        // 对每个节点进行 DFS 遍历
        for (int j = 0; j < n; j++) {
            res.add(dfs(j, new ArrayList<Integer>(Arrays.asList(j))));
        }

        // 输出最大连通子集的大小
        System.out.println(Collections.max(res));
    }

    // DFS 遍历函数
    public static int dfs(int k, List<Integer> visited) {
        List<Integer> items = new ArrayList<>();
        for (int i = 0; i < n; i++) {
            if (k != i && nums[k][i] == 1) {  // 如果节点 k 和节点 i 之间有边且未访问
                if (!visited.contains(i)) {
                    visited.add(i);  // 标记节点 i 为已访问
                    items.add(dfs(i, visited));  // 递归访问节点 i
                }
            }
        }

        int max_ = 0;
        if (!items.isEmpty()) {
            max_ = Collections.max(items);  // 计算当前节点的最大连通子集
        }

        return max_ + 1;  // 返回连通子集的大小
    }
}